template <typename  T>
BinNodePosi(T) AVL<T>::insert(T const &e) {
	BinNodePosi(T) &x = this->search(e);
	if(x) return x;

	BinNodePosi(T) xx = x = new BinNode<T>(e, this->_hot);
	++this->_size;

	for(BinNodePosi(T) g = this->_hot; g; g = g->parent) {
		/* It's going to be balanced by the 3 + 4 algorithm */
		if(!AvlBalanced(*g)) {
			BinNodePosi(T) *pparent = &FromParentTo(*g);
			*pparent = this->rotateAt(tallerChild(tallerChild(g)));
			break;
		}
		else {
			/* balance may increase the height */
			this->updateHeight(g);
		}
	}

	return xx;
}